// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// Check that the optimizer does not fuse constants with different
// representations.
//
// SharedObjects=ffi_test_functions

import "dart:ffi";

import "dylib_utils.dart";

typedef VigesimalOp =
    double Function(
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
      int,
      double,
    );

typedef NativeVigesimalOp =
    Double Function(
      IntPtr,
      Float,
      IntPtr,
      Double,
      IntPtr,
      Float,
      IntPtr,
      Double,
      IntPtr,
      Float,
      IntPtr,
      Double,
      IntPtr,
      Float,
      IntPtr,
      Double,
      IntPtr,
      Float,
      IntPtr,
      Double,
    );

main() {
  final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");

  final sumManyNumbers = ffiTestFunctions
      .lookupFunction<NativeVigesimalOp, VigesimalOp>("SumManyNumbers");

  // Should not crash.
  sumManyNumbers(
    1,
    2.0,
    3,
    4.0,
    5,
    6.0,
    7,
    8.0,
    9,
    10.0,
    11,
    12.0,
    13,
    14.0,
    15,
    16.0,
    17,
    18.0,
    19,
    20.0,
  );
}
